package cn.swing.main.srv.cv.model;

import lombok.Data;
import org.opencv.core.Scalar;

@Data
public class TennisPoint {

    /**
     * 中心点 X
     */
    double x;

    /**
     * 中心点 Y
     */
    double y;

    /**
     * 宽度
     */
    double width;

    /**
     * 高度
     */
    double height;

    /**
     * 帧数
     */
    int frameNumber;

    /**
     * X方向速度
     */
    Double vx = 0.0;

    /**
     * Y方向速度
     */
    Double vy = 0.0;

    /**
     * 轨迹变化，如果为null 代表不是轨迹变化点
     */
    String trajectoryId;

    /**
     * 中心点1/2区域的中位数颜色
     */
    Scalar medianColor;

    /**
     * 中心点1/2区域的平均颜色
     */
    Scalar meanColor;

    /**
     * 中心点1/2区域的HSV颜色
     */
    Scalar hsvColor;

    /**
     * 原始识别的角点的圆形度 1为正圆。
     */
    double circularity;

    /**
     * 中心点1/2区域的亮度
     */
    double bright;

    /**
     * frame的平均亮度
     */
    double frameBright;

    /**
     * frame的顶部1/5区域平均亮度
     */
    double frameTopBright;

    /**
     * 0代表未被过滤，1代表面积不合适 2代表颜色不合适 3代表亮度不合适
     */
    int filterType;

    public TennisPoint() {

    }

    public TennisPoint(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public TennisPoint(double x, double y, double width, double height, int frameNumber) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.frameNumber = frameNumber;
    }

    @Override
    public String toString() {
        return "("
                + x
                + ", " + y
                + ", " + width
                + ", " + height
                + ", f=" + frameNumber
                + ", vx=" + vx
                + ", vy=" + vy
                + ", rgb=" + "[" + Math.floor(medianColor.val[2])
                + ", " + Math.floor(medianColor.val[1]) + ", " + Math.floor(medianColor.val[1]) + "]"
                + ')';
    }

    @Override
    public boolean equals(Object tennisPoint) {
        if (tennisPoint instanceof TennisPoint) {
            return this.x == ((TennisPoint) tennisPoint).getX()
                    && this.y == ((TennisPoint) tennisPoint).getY()
                    && this.width == ((TennisPoint) tennisPoint).getWidth()
                    && this.height == ((TennisPoint) tennisPoint).getHeight()
                    && this.frameNumber == ((TennisPoint) tennisPoint).getFrameNumber();
        }
        return false;
    }

}
